package cn.yangliu.config;

import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

/**
 * the type of com-tool
 *
 * <p>
 * .
 *
 * @author 杨柳
 * @date 2021-09-28
 */
@Component
public class AutoResponseCommandContainer {

    /**
     * Map<配置名, <收到指令, 响应指令>>缓存
     */
    private final Map<String, Map<String, String>> autoResponseCommandMap = new ConcurrentHashMap<>();

    /**
     * 存放缓存
     *
     * @param key 配置名
     * @param properties <收到指令, 响应指令>
     */
    public void put(String key, Map<String, String> properties) {
        autoResponseCommandMap.put(key, properties);
    }

    /**
     * 根据配置名获取指令键值对
     *
     * @param key 配置名
     * @return <收到指令, 响应指令>
     */
    public Map<String, String> get(String key) {
        return autoResponseCommandMap.get(key);
    }

    /**
     * 是否存在该配置缓存
     *
     * @param key 配置名
     * @return 是否存在
     */
    public boolean containsKey(String key) {
        return autoResponseCommandMap.containsKey(key);
    }

    /**
     * 根据配置名和收到数据得到响应指令
     *
     * @param key 配置名
     * @param cmd 收到指令
     * @return 回复指令
     */
    public String getCommand(String key, String cmd) {
        return autoResponseCommandMap.get(key).get(cmd);
    }

    /**
     * 查询是否包含该收到指令
     *
     * @param key 配置名
     * @param cmd 收到指令
     * @return 是否包含
     */
    public boolean containsCommand(String key, String cmd) {
        if (!containsKey(key)) {
            return false;
        }
        return autoResponseCommandMap.get(key).containsKey(cmd);
    }

    public String match(String key, String cmd) {
        if (!containsKey(key)) {
            return null;
        }
        Map<String, String> map = autoResponseCommandMap.get(key);
        List<String> strings = map.keySet().stream().sorted().collect(Collectors.toList());
        for (String string : strings) {
            if (cmd.startsWith(string)) {
                return map.get(string);
            }
        }
        return null;
    }
    /**
     * 根据配置名删除指令集
     *
     * @param key 配置名
     * @return 删除成功与否
     */
    public boolean remove(String key) {
        if (!autoResponseCommandMap.containsKey(key)) {
            return false;
        }
        autoResponseCommandMap.remove(key);
        return true;
    }

}
